package com.example.proyectofc;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.ArrayList;

import procesamiento.energiaLocalizada;

import almacenamiento.Coordenada;
import android.app.Activity;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class info extends Activity implements SensorEventListener {
	
	private TextView nombre, edad, peso;
	private Button grabarActividad, cambiarPantalla;
	private EditText nombreArchivo;
	
	private SensorManager sens;
	private File ruta;
	private File fichAcelerometro;
	private FileOutputStream escritor;
	private OutputStreamWriter esc;
	
	private boolean grabar = false, finalizado = false;
	private boolean grabadoDatos = false;
	private String nombreFichero;
	private float valorX, valorY, valorZ;
	
	private DecimalFormatSymbols simbolos = new DecimalFormatSymbols();
	private DecimalFormat formateador;
	
	private float alpha = (float) 0.8;
	
	private float gravedad[] = {0, 0, 0};
	
	private ArrayList<Coordenada> recorrido = new ArrayList<Coordenada>();
	private ArrayList<Double> patron = new ArrayList<Double>();
	
	final Handler manejador = new Handler();
	
	private double resultado = 0;
	

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.info);
		
//		simbolos.setDecimalSeparator(',');
		
		nombre = (TextView) findViewById(R.id.textViewNivelInf);
		edad = (TextView) findViewById(R.id.textViewMostrarEdadInf);
		peso = (TextView) findViewById(R.id.textViewMostrarNombreInf);
		
		grabarActividad = (Button) findViewById(R.id.buttonGrabar);
		cambiarPantalla = (Button) findViewById(R.id.buttonEliminarPartida);
		
		nombreArchivo = (EditText) findViewById(R.id.editTextNombreMod);
		
		nombre.setText(Utilidades.getUsuarioJugador().getNombre());
		edad.setText(Utilidades.getUsuarioJugador().getEdad());
		peso.setText(Utilidades.getUsuarioJugador().getPeso());
		
		sens = (SensorManager) getSystemService(SENSOR_SERVICE); 
		sens.registerListener(this, 
				sens.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION), 
        		SensorManager.SENSOR_DELAY_FASTEST);	

		cambiarPantalla.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Intent myIntent = new Intent(v.getContext(), juego.class);
                startActivity(myIntent);
				finish();
			}
		}); 

		
        grabarActividad.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				if ( grabar == false) {
					recorrido = new ArrayList<Coordenada>();
					grabarActividad.setText("Parar");
					grabar = true;
					nombreFichero = nombreArchivo.getText().toString(); 
				}
				else {
					grabarActividad.setText("Calculando");
					grabar = false;

					hilo();
//					if(finalizado) {
//						
//					}
					
				}
			}
		});
 	}

	@Override
	public void onAccuracyChanged(Sensor arg0, int arg1) {
		
	}

	@Override
	public void onSensorChanged(SensorEvent event) {
		
//		if (grabar == true) {
//			gravedad[0] = alpha * gravedad[0] + (1 - alpha) 
//					* event.values[0];
//			gravedad[1] = alpha * gravedad[1] + (1 - alpha) 
//					* event.values[1]; 
//			gravedad[2] = alpha * gravedad[2] + (1 - alpha) 
//					* event.values[2];
//			
//			valorX = event.values[0] - gravedad[0];
//			valorY = event.values[1] - gravedad[1];
//			valorZ = event.values[2] - gravedad[2];
//			
//			recorrido.add(new Coordenada(valorX, valorY, valorZ));
//		}

		formateador = new DecimalFormat("####.####",simbolos);
		if (Environment.getExternalStorageState().equals("mounted")) {
			ruta = Environment.getExternalStorageDirectory();
			
			if(grabadoDatos == false && grabar) {
				recorrido = new ArrayList<Coordenada>();
				fichAcelerometro = new File (ruta, nombreFichero + ".txt");
				grabadoDatos = true;
				try {
					escritor = new FileOutputStream(fichAcelerometro);
					esc = new OutputStreamWriter(escritor);

				} catch (IOException e) {
					e.printStackTrace();
				}
			}
				
			if (grabar == true) {
				gravedad[0] = alpha * gravedad[0] + (1 - alpha) 
						* event.values[0];
				gravedad[1] = alpha * gravedad[1] + (1 - alpha) 
						* event.values[1]; 
				gravedad[2] = alpha * gravedad[2] + (1 - alpha) 
						* event.values[2];
				
				valorX = event.values[0] - gravedad[0];
				valorY = event.values[1] - gravedad[1];
				valorZ = event.values[2] - gravedad[2];
				
				recorrido.add(new Coordenada(valorX, valorY, valorZ));
				
				try {
					esc.append(formateador.format(valorX) + " \t " 
							+ formateador.format(valorY) + " \t " 
							+ formateador.format(valorZ) + "\n");
					esc.flush();
				} catch (IOException e) {
					e.printStackTrace();
				}

			}
			if (grabar == false && grabadoDatos) {
				try {
					esc.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			
		}
				

	}
	
	@Override
	protected void onStop() {
	    SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);        
	    sm.unregisterListener(this);
	    super.onStop();
	}
	
	protected void hilo() {
		Thread hilo = new Thread() {
			public void run() {
				manejador.post(accion);
			}
		};
		
		hilo.start();
	}
	
	final Runnable accion = new Runnable() {

		@Override
		public void run() {
			resultado = 0;
			patron = new ArrayList<Double>();
			UtilidadesAcelerometro.leerPatron(patron, 
					getResources().openRawResource(R.raw.solabdo));
			if (! patron.isEmpty() && ! recorrido.isEmpty()) {
				ArrayList<Double> rec = new ArrayList<Double>(), 
						aux = new ArrayList<Double>();
				
//				for(int i = 0; i < patron.size(); i++) {
//		    		aux.add(patron.get(i).getX() + patron.get(i).getY() 
//		    				+ patron.get(i).getZ());
//		    	}
				
				rec.addAll(energiaLocalizada.eLocalizada(recorrido));
				Dtw set1 = new Dtw(patron, rec);
				resultado = set1.getDistancia(); 
				nombreArchivo.setText(Double.toString(resultado));
				grabarActividad.setText("Grabar");
			}
		}
		
	};
}
